﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ConfeccionesJR.Entites;
using System.Data;
using System.Data.Objects;


namespace ConfeccionesJR.Repository
{
    public class ProformaRepository : MasterDataAccess , IProformaRepository
    {
        public List<PROFORMA> GetAllFromProformasByCriterio(string criterio)
        {
            var query = from p in Context.PROFORMAs
                        .Include("CLIENTE")
                        .Include("DETALLEPROFORMAs.PRODUCTO")
                        select p;

            if (criterio!=null && criterio!=string.Empty && criterio!="")
            {
                query = query.Where(p => p.CLIENTE.NombreRazonSocial.ToUpper().Contains(criterio.ToUpper())
                     || p.CLIENTE.DniRuc.Contains(criterio));

            }
            ObjectContext.Refresh(RefreshMode.StoreWins, query);
            return query.ToList();
        }

        public PROFORMA GetProformaById(int id)
        {
            var query = from p in Context.PROFORMAs.Include("DETALLEPROFORMAs.PRODUCTO")
                        where p.Id.Equals(id)
                        select p;

            ObjectContext.Refresh(RefreshMode.StoreWins, query);

            return query.SingleOrDefault();
        }

        public void AddProforma(PROFORMA proforma)
        {
            foreach (var item in proforma.DETALLEPROFORMAs)
            {
                Context.Entry(item.Producto).State = EntityState.Unchanged;
                Context.Entry(item).State = EntityState.Added;
            }

            Context.Entry(proforma.CLIENTE).State = EntityState.Unchanged;
            Context.PROFORMAs.Add(proforma);
            Context.SaveChanges();
        }

        public void UpdateProforma(PROFORMA proforma)
        {
            var estadoDetalle = Context.ChangeTracker.Entries<DETALLEPROFORMA>();
            
            proforma.CLIENTE = null;
            Context.Entry(proforma).State = EntityState.Modified;

           foreach (var item in proforma.DETALLEPROFORMAs)
            {
                item.Producto = null;

                Context.Entry(item).State = item.Id == 
                    Int32.Parse("0") ? EntityState.Added : EntityState.Modified;

                item.productoId = item.productoId;
            }
           
            Context.SaveChanges();

        }

        public void RemoveProforma(int id)
        {
            var existe = Context.PROFORMAs.Find(id);
            if (existe!=null)
            {
                Context.PROFORMAs.Remove(existe);
                Context.SaveChanges();
            }
        }

        public List<PROFORMA> GetFromProformasbyFechasAndCliente(DateTime? fec1, DateTime? fec2, string cliente)
        {
            #region IF

            if (cliente != null && cliente != string.Empty && cliente != "")  // FECHAS - CLIENTE 
            {
                var query = from h in Context.PROFORMAs.Include("CLIENTE")

                            select h;

                if (fec1 != null && fec2 != null)//fechas y cliente
                {
                    query = from h in query
                            where (h.Fecha >= fec1.Value && h.Fecha <= fec2.Value) &&
                                    (h.CLIENTE.NombreRazonSocial.ToUpper().Contains(cliente.ToUpper()) ||
                                    h.CLIENTE.DniRuc.ToUpper().Contains(cliente.ToUpper()))
                            select h;

                    ObjectContext.Refresh(RefreshMode.StoreWins, query);

                }
                if (fec1 != null && fec2 == null)//dia y cliente 
                {
                    query = from h in query
                            where
                            (h.CLIENTE.NombreRazonSocial.ToUpper().Contains(cliente.ToUpper()) ||
                            h.CLIENTE.DniRuc.ToUpper().Contains(cliente.ToUpper())) && h.Fecha == fec1.Value
                            select h;

                    ObjectContext.Refresh(RefreshMode.StoreWins, query);

                }
                if (fec1 == null && fec2 == null)//solo cliente
                {
                    query = from h in query
                            where h.CLIENTE.NombreRazonSocial.ToUpper().Contains(cliente.ToUpper()) ||
                            h.CLIENTE.DniRuc.ToUpper().Contains(cliente.ToUpper())
                            select h;

                    ObjectContext.Refresh(RefreshMode.StoreWins, query);

                }
                else //retornar todos
                {
                    query = from h in query
                            select h;

                    ObjectContext.Refresh(RefreshMode.StoreWins, query);

                }
                return query.Take(500).ToList();
            }

            #endregion

            #region ELSE

            else //sin cliente
            {
                var query = from h in Context.PROFORMAs.Include("CLIENTE")
                            select h;

                if (fec1 != null && fec2 != null)//rango de fechas
                {
                    query = from h in query
                            where h.Fecha >= fec1.Value && h.Fecha <= fec2.Value
                            select h;

                    ObjectContext.Refresh(RefreshMode.StoreWins, query);

                }
                if (fec1 != null && fec2 == null)//solo dia
                {
                    query = from h in query
                            where
                            h.Fecha == fec1.Value
                            select h;

                    ObjectContext.Refresh(RefreshMode.StoreWins, query);

                }
                if (fec1 == null && fec2 == null)//solo cliente
                {
                    query = from h in query
                            select h;

                    ObjectContext.Refresh(RefreshMode.StoreWins, query);

                }
                return query.Take(500).ToList();
            }
            #endregion
        }



        /*        ALTER PROCEDURE [dbo].[GetProformaByCliente]
@IdProforma int
AS
BEGIN
SELECT     C.NombreRazonSocial, C.DniRuc, C.Ciudad, C.Direccion, C.Encargado ,C.Telefono, C.RPC, C.RPM, C.Email,
		   P.Fecha, P.Total, P.CondicionPago, P.Vigencia, P.TiempoEntrega,
		   ROW_NUMBER() OVER(ORDER BY DetP.Id DESC) AS Item,
		   PRO.Descripcion AS PRODUCTOs, UM.Descripcion UndmEDIDAS,
		   DetP.Cantidad, DetP.PrecioUnit,(DetP.Cantidad * DetP.PrecioUnit) TotalItem
		   
FROM 
UNIDAD_MEDIDA UM INNER JOIN PRODUCTO PRO ON UM.Id = PRO.undMedidaId
INNER JOIN DETALLE_PROFORMA DetP ON PRO.Id = DetP.productoId
INNER JOIN PROFORMA P ON DetP.proformaId = P.Id
INNER JOIN CLIENTE C ON P.clienteId = C.Id
WHERE P.Id = @IdProforma

END
         */

    }
}
